package jdbc;

import java.sql.*;

/**
 * 完成用户登录功能
 * 程序启动后要求用户输入用户名和密码，然后取userinfo表中检索是否存在该注册用户，如果可以
 * 检索出记录则认为是登录成功，否则登录失败
 *
 * SELECT id,username,password,nickname,age
 * FROM userinfo
 * WHERE username='输入的' AND password='输入的'
 *
 */
public class LoginDemo {
    public static void main(String[] args) {
        UserInfo userInfo = InputUtil.getInputObject(new UserInfo(),"欢迎登录","登录");

        try (
                Connection connection = DBUtil.getConnection();
        ){
            //先拼接好SQL再整体发送给数据库会存在SQL注入攻击的漏洞！
//            Statement statement = connection.createStatement();
//            String sql = "SELECT id,username,password,nickname,age " +
//                         "FROM userinfo " +
//                         "WHERE username='"+userInfo.getUsername()+"' " +
//                         "AND password='"+userInfo.getPassword()+"'";
//            ResultSet rs = statement.executeQuery(sql);

            //预编译SQL，将值先用"?"占位，将SQL语义定死。没有任何拼接用户输入信息的操作
            String sql = "SELECT id,username,password,nickname,age " +
                         "FROM userinfo " +
                         "WHERE username=? AND password=?";
            /*
                创建PreparedStatement时，就先将预编译SQL语句发送给数据库，此时数据库
                会根据予以生成执行计划(数据库理解了该SQL的意图)，只是还无法执行，因为
                缺少用户名和密码的值
             */
            PreparedStatement ps = connection.prepareStatement(sql);
            //通过PreparedStatement为预编译SQL中占位的两个?设置值
            ps.setString(1,userInfo.getUsername());
            ps.setString(2,userInfo.getPassword());
            //此时执行时会将两个值发送给数据库取执行查询操作
            //数据库也仅会将两个值就当作值使用，哪怕里面还有SQL关键字也不会当作SQL使用
            ResultSet rs = ps.executeQuery();

            if(rs.next()){
                System.out.println("登录成功，欢迎你:"+rs.getString("nickname"));
            }else{
                System.out.println("登录失败，密码或用户户名不正确");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }
}